package 泛型;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? extends Fruit> src = getExtendsList();
        List<? super Fruit> dest = getSuperList();
        Collections.copy(dest, src);
    }

    private static List<? extends Fruit> getExtendsList() {
        List<? extends Fruit> list;
        // Explicit type argument Fruit can be replaced with <> 意思就是new ArrayList<Fruit>() 可以写成 new ArrayList<>()
        list = new ArrayList<Fruit>();
        list = new ArrayList<Apple>();
        list = new ArrayList<Banana>();
        return list;
    }

    private static List<? super Fruit> getSuperList() {
        List<? super Fruit> list;
        list = new ArrayList<Fruit>();
        list = new ArrayList<Object>();
        return list;
    }

    private static void m1(List<? extends Fruit> list) {
        /**
         * 这里获取到的 list 可能是ArrayList<Banana>,ArrayList<Apple>,ArrayList<Fruit>,
         * 具体是哪一种,这里不知道,所以获取元素时只能按照ArrayList<Fruit>()算,获取到的元素一定是Fruit
         * 没法确定具体的类型就没法添加元素, 例如使用list.add(new Apple())但是list可能是new ArrayList<Banana>()
         */
        Fruit fruit = list.get(0);
        // list.add(new Apple());
    }

    private static void m2(List<? super Fruit> list) {
        /**
         * 这里接收到的list 可能是 ArrayList<Fruit>,ArrayList<Object>,
         * 具体是哪一种,这里不清楚,所以添加元素时只能按照 ArrayList<Fruit>算,获取元素时只能按照ArrayList<Object>算
         */
        list.add(new Apple());
        list.add(new Banana());
        // 获取到的是Object 泛型对于获取元素没啥意义
        Object object = list.get(0);
    }
}
